package main
import (
	"fmt"
	"sync"
)

//定义全局变量
var (
	myMap = make(map[int]int,10)
	//声明一个全局的互斥锁
	//lock 是一个全局的互斥锁
	//mutex 互斥
	lock sync.Mutex
)

//计算n的阶乘 然后将结果放入到map中
func test(n int){
	res := 1
	for i := 1; i <= n; i++{
		res *= i
	}
	//这里我们将res 放入map
	//加锁
	lock.Lock()
	myMap[n] = res // fatal error: concurrent map writes
	lock.Unlock()
}

func main(){
	//实现1-200 各个数阶乘
	//开启多个协程完成这个任务
	for i := 1 ; i <= 200; i++ {
		go test(i)
	}
	//time.Sleep(time.Second * 10)
	lock.Lock()
	//输出结果
	for k,v := range myMap {
		fmt.Printf("map[%d] = %d\n",k,v)
	}
	lock.Unlock()
}
